package pe.gob.mininter.dirandro.vaadin.panel.busqueda;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.DetPerVehExp;
import pe.gob.mininter.dirandro.model.Expediente;
import pe.gob.mininter.dirandro.model.ModeloMarca;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Vehiculo;
import pe.gob.mininter.dirandro.service.ExpedienteVehiculoService;
import pe.gob.mininter.dirandro.service.ModeloMarcaService;
import pe.gob.mininter.dirandro.service.VehiculoService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;


public class PanelBuscarVehiculo extends DirandroComponent {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
	
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblVehiculos;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_3;
	@AutoGenerated
	private Button btnLimpiar;
	@AutoGenerated
	private Button btnBuscar;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;
	@AutoGenerated
	private PopupDateField dtExpFin;
	@AutoGenerated
	private PopupDateField dtExpInicio;
	@AutoGenerated
	private Label lblFechas;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private ComboBoxLOVS cmbAnio;
	@AutoGenerated
	private ComboBox cmbModelo;
	@AutoGenerated
	private ComboBox cmbMarca;
	@AutoGenerated
	private TextField txtPlaca;
	private static final long serialVersionUID = -6241989533669580659L;
	
	private static final Logger logger = Logger.getLogger( PanelBuscarVehiculo.class );
	
	private ModeloMarcaService modeloMarcaService;
	private VehiculoService vehiculoService;
	private ExpedienteVehiculoService expVehiculoService;
	private IndexedContainer container;
	
	private List<ModeloMarca> lstMarcas;
	private List<ModeloMarca> lstModelos;
	private List<DetPerVehExp> lstExpVehiculos;
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelBuscarVehiculo(List<Opcion> acciones, String height) {
		super(acciones, height);
		buildMainLayout();
		modeloMarcaService = Injector.obtenerServicio(ModeloMarcaService.class);
		vehiculoService = Injector.obtenerServicio(VehiculoService.class);
		expVehiculoService= Injector.obtenerServicio(ExpedienteVehiculoService.class);
		setCompositionRoot(mainLayout);
		postConstruct();
		debugId();
	}
	
	private void debugId(){
		
	}
	
	public void postConstruct() {
	
		dtExpFin.setInputPrompt("dd/mm/aa");
		dtExpInicio.setInputPrompt("dd/mm/aa");
		cmbMarca.setInputPrompt("Marca");
		cmbModelo.setInputPrompt("Modelo");
		cmbAnio.setInputPrompt("Año de Fabricación");
		cmbAnio.setCodigoLista(Constante.LISTA.CODIGO.PERIODO);
		
		cargarMarcas();
		inicializaTabla();
		
		btnBuscar.addListener( new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				buscarVehiculo();
			}
		});
	
		btnLimpiar.addListener( new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				limpiar();
			}
		});
	}
	
	private void cargarMarcas(){
		lstMarcas = modeloMarcaService.buscarHijos(new ModeloMarca(Constante.MODELO_MARCA.TRANSPORTE.AUTO));
		cmbMarca.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstMarcas));
		cmbMarca.setItemCaptionPropertyId("nombre");
		cmbMarca.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbMarca.setImmediate(true);
		cmbMarca.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = -3624342478575320920L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				cargarModelosChange(event);
			}
			
		});
	}

	private void cargarModelosChange(ValueChangeEvent event) {
		lstModelos = modeloMarcaService.buscarHijos((ModeloMarca) cmbMarca.getValue());
		cmbModelo.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstModelos));
		cmbModelo.setItemCaptionPropertyId("nombre");
		cmbModelo.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		if (lstModelos.size() != 0) cmbModelo.setEnabled(true);
		else cmbModelo.setEnabled(false);
	}
	
	private void inicializaTabla(){
		
		container = new IndexedContainer();
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("vehiculo", Vehiculo.class, null);
		container.addContainerProperty("vehiculo.id", Long.class, null);		
		container.addContainerProperty("vehiculo.placa", String.class, null);
		container.addContainerProperty("vehiculo.tipoTamano", String.class, null);
		container.addContainerProperty("vehiculo.fabricacion", String.class, null);
		container.addContainerProperty("estado.id", Long.class, null);
		container.addContainerProperty("estadoChasis.id", Long.class, null);
		container.addContainerProperty("estadoMotor.id", Long.class, null);
		container.addContainerProperty("situacion.id", Long.class, null);
		container.addContainerProperty("estadoChasis", String.class, null);
		container.addContainerProperty("estadoMotor", String.class, null);
		container.addContainerProperty("placaMontada", String.class, null);
		container.addContainerProperty("tipoUso", String.class, null);
		container.addContainerProperty("observacion", String.class, null);
		container.addContainerProperty("propietario.id", Long.class, null);
		container.addContainerProperty("propietario", Persona.class, null);
		container.addContainerProperty("personaImplicada.id", Long.class, null);
		container.addContainerProperty("personaImplicada", Persona.class, null);
		container.addContainerProperty("personaImplicada.nombre", String.class, null);
		
		tblVehiculos.setContainerDataSource(container);
		tblVehiculos.setVisibleColumns(new Object[]{"id","vehiculo.placa","vehiculo.tipoTamano","vehiculo.fabricacion","estadoChasis","estadoMotor","personaImplicada.nombre"});
		
		tblVehiculos.setColumnHeader("id", "Id");
		tblVehiculos.setColumnHeader("vehiculo.placa", "Placa");
		tblVehiculos.setColumnHeader("vehiculo.tipoTamano", "Tamaño");
		tblVehiculos.setColumnHeader("vehiculo.fabricacion", "Fabricación");
		tblVehiculos.setColumnHeader("estadoChasis", "Estado Chasis");
		tblVehiculos.setColumnHeader("estadoMotor", "Estado Motor");
		tblVehiculos.setColumnHeader("personaImplicada.nombre", "Implicado");
		
	}
	
	private void cargarTabla( ){
		
		if(lstExpVehiculos!=null){
			tblVehiculos.removeAllItems();
			int con=1;
			for (DetPerVehExp expVehiculo : lstExpVehiculos){
				Item item = container.addItem(con++);
				item.getItemProperty("id").setValue(expVehiculo.getId());
				item.getItemProperty("vehiculo").setValue(expVehiculo.getVehiculo());
				item.getItemProperty("vehiculo.id").setValue(expVehiculo.getVehiculo() != null ? expVehiculo.getVehiculo().getId() : null);
				item.getItemProperty("vehiculo.placa").setValue(expVehiculo.getVehiculo().getPlaca());
				item.getItemProperty("vehiculo.tipoTamano").setValue(HarecUtil.valorNombreToEmpty(expVehiculo.getVehiculo().getTipoTamano()));
				item.getItemProperty("vehiculo.fabricacion").setValue(HarecUtil.valorNombreToEmpty(expVehiculo.getVehiculo().getPeriodoFabricacion()));
				item.getItemProperty("estado.id").setValue(HarecUtil.valorIdToEmpty(expVehiculo.getEstado()));
				item.getItemProperty("estadoChasis.id").setValue(HarecUtil.valorIdToEmpty(expVehiculo.getEstadoChasis()));
				item.getItemProperty("estadoMotor.id").setValue(HarecUtil.valorIdToEmpty(expVehiculo.getEstadoMotor()));
				item.getItemProperty("situacion.id").setValue(HarecUtil.valorIdToEmpty(expVehiculo.getSituacionLegal()));
				item.getItemProperty("estadoChasis").setValue(HarecUtil.valorNombreToEmpty(expVehiculo.getEstadoChasis()));
				item.getItemProperty("estadoMotor").setValue(HarecUtil.valorNombreToEmpty(expVehiculo.getEstadoMotor()));
				item.getItemProperty("placaMontada").setValue(expVehiculo.getPlacaMontada());
				item.getItemProperty("tipoUso").setValue(expVehiculo.getTipoUso());
				item.getItemProperty("observacion").setValue(expVehiculo.getObservaciones());
				if(expVehiculo.getPropietario()!=null){
					item.getItemProperty("propietario").setValue(expVehiculo.getPropietario());
					item.getItemProperty("propietario.id").setValue(expVehiculo.getPropietario().getId());
				}
				if(expVehiculo.getPersonaImplicada()!=null){
					item.getItemProperty("personaImplicada.id").setValue(expVehiculo.getPersonaImplicada().getId());
					item.getItemProperty("personaImplicada").setValue(expVehiculo.getPersonaImplicada());
					item.getItemProperty("personaImplicada.nombre").setValue(expVehiculo.getPersonaImplicada().getNombreCompleto());	
				}
			}	
		}
	}
	
	private void buscarVehiculo(){
		
		DetPerVehExp vehi = new DetPerVehExp();
		
		Vehiculo vh = new Vehiculo();
		vh.setPeriodoFabricacion( cmbAnio.getValor() );
		vh.setPlaca( HarecUtil.nullToEmpty( txtPlaca.getValue() ));
		vh.setModeloMarca( (ModeloMarca)cmbModelo.getValue() );
		vehi.setVehiculo( vh );
		
		Expediente ex = new Expediente();
		ex.setFechaRegistro( (Date)dtExpInicio.getValue() );
		ex.setFechaRegistroFinal((Date)dtExpFin.getValue() );
		vehi.setExpediente(ex);
		
		lstExpVehiculos = expVehiculoService.buscar( vehi );
		logger.debug( " vehculos encontrados " + lstExpVehiculos.size() );
		cargarTabla();
		
	}
	
	private void limpiar(){
		
		txtPlaca.setValue("");
		cmbMarca.setValue(null);
		cmbModelo.setValue(null);
		dtExpFin.setValue(null);
		dtExpInicio.setValue(null);
		
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("800px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlPrincipal.addComponent(horizontalLayout_1);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		pnlPrincipal.addComponent(horizontalLayout_2);
		
		// horizontalLayout_3
		horizontalLayout_3 = buildHorizontalLayout_3();
		pnlPrincipal.addComponent(horizontalLayout_3);
		
		// tblVehiculos
		tblVehiculos = new Table();
		tblVehiculos.setImmediate(false);
		tblVehiculos.setWidth("800px");
		tblVehiculos.setHeight("350px");
		pnlPrincipal.addComponent(tblVehiculos);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// txtPlaca
		txtPlaca = new TextField();
		txtPlaca.setCaption("Placa:");
		txtPlaca.setImmediate(false);
		txtPlaca.setWidth("150px");
		txtPlaca.setHeight("-1px");
		txtPlaca.setInputPrompt("Nro. Placa");
		horizontalLayout_1.addComponent(txtPlaca);
		
		// cmbMarca
		cmbMarca = new ComboBox();
		cmbMarca.setCaption("Marca");
		cmbMarca.setImmediate(false);
		cmbMarca.setWidth("-1px");
		cmbMarca.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbMarca);
		
		// cmbModelo
		cmbModelo = new ComboBox();
		cmbModelo.setCaption("Modelo");
		cmbModelo.setImmediate(false);
		cmbModelo.setWidth("-1px");
		cmbModelo.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbModelo);
		
		// cmbAnio
		cmbAnio = new ComboBoxLOVS();
		cmbAnio.setCaption("Año de Fabricación");
		cmbAnio.setImmediate(false);
		cmbAnio.setWidth("-1px");
		cmbAnio.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbAnio);
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(false);
		horizontalLayout_2.setSpacing(true);
		
		// lblFechas
		lblFechas = new Label();
		lblFechas.setImmediate(false);
		lblFechas.setWidth("150px");
		lblFechas.setHeight("-1px");
		lblFechas.setValue("Rango de Expediente:");
		horizontalLayout_2.addComponent(lblFechas);
		horizontalLayout_2.setComponentAlignment(lblFechas, new Alignment(48));
		
		// dtExpInicio
		dtExpInicio = new PopupDateField();
		dtExpInicio.setCaption("Fecha Inicial:");
		dtExpInicio.setImmediate(false);
		dtExpInicio.setWidth("150px");
		dtExpInicio.setHeight("-1px");
		dtExpInicio.setResolution(4);
		horizontalLayout_2.addComponent(dtExpInicio);
		
		// dtExpFin
		dtExpFin = new PopupDateField();
		dtExpFin.setCaption("Fecha Final");
		dtExpFin.setImmediate(false);
		dtExpFin.setWidth("150px");
		dtExpFin.setHeight("-1px");
		dtExpFin.setResolution(4);
		horizontalLayout_2.addComponent(dtExpFin);
		
		return horizontalLayout_2;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_3() {
		// common part: create layout
		horizontalLayout_3 = new HorizontalLayout();
		horizontalLayout_3.setImmediate(false);
		horizontalLayout_3.setWidth("100.0%");
		horizontalLayout_3.setHeight("-1px");
		horizontalLayout_3.setMargin(false);
		
		// btnBuscar
		btnBuscar = new Button();
		btnBuscar.setCaption("Buscar");
		btnBuscar.setImmediate(true);
		btnBuscar.setWidth("-1px");
		btnBuscar.setHeight("-1px");
		horizontalLayout_3.addComponent(btnBuscar);
		horizontalLayout_3.setComponentAlignment(btnBuscar, new Alignment(6));
		
		// btnLimpiar
		btnLimpiar = new Button();
		btnLimpiar.setCaption("Limpiar");
		btnLimpiar.setImmediate(true);
		btnLimpiar.setWidth("-1px");
		btnLimpiar.setHeight("-1px");
		horizontalLayout_3.addComponent(btnLimpiar);
		
		return horizontalLayout_3;
	}	
	
	
	
	

}
